Azure Container InstancesへのHTTP接続元を制限してみた
いわさです。
Azureには、Azure Container Instances(ACI)というサービスがあります。
ACIを使うと、コンテナーイメージを指定するのみでサーバーを一切管理することなくサービスを展開することが可能です。
しかし、このACIはマネージドなセキュリティ設定が特に用意されておらず、パブリック展開されたものは攻撃を受ける可能性があります。
本日はプライベート展開(VNET統合)を使ったデプロイと、その上で特定IPアドレスからのみACIへHTTPアクセス出来るような構成を考えてみましたのでご紹介します。
パブリックなACI
パブリックコンテナーインスタンスの作成はシンプルで、リージョンとサイズ以外だと基本的にはイメージを指定するだけで使い始めることが出来ます。
また、ACIにはデフォルトでクイックスタートイメージが用意されており、この設定を使うと検証用のHTTPサービスなどをすぐ作成出来ます。イメージを用意する必要がありません。
ネットワーク設定はパブリックを設定しておくと、コンテナーインスタンスへ接続出来るパブリックIPアドレスが構成されます。
DNS名ラベルを指定しておくと、FQDNでアクセス出来るようになります。
すぐに起動され、アクセス出来ました。
IPアドレスでの接続も可能です。
しかし、セキュリティレイヤーが何も無いのでこのままだと攻撃を受ける可能性があります。
VNET+Application Gateway+NSGで制御出来る
そこで、ACIのネットワーク設定時にプライベートを選択し、VNETを統合することで、VNETのセキュリティ機能を使うことが出来ます。
ただし、VNETに展開するとパブリックな接続が出来なくなるため、その経路を用意する必要があります。
いくつかのオプションが考えられますが、Azureロードバランサーなどは使うことが出来ません。
ACIのドキュメントにもサポートされてないネットワークシナリオとしてALB(Azure Load Balancer)を配置することはサポートされていません。となっています。
同様に、パブリックIPアドレスを使ってインターネットへ公開することもサポートされていません。
実際に試してみましたが、上記についてはどちらもネットワークインターフェースがバックエンドに必要で、ACIの場合は提供されていませんでした。
ドキュメントには記述がありませんでしたが、対策としてはAzure Application Gatewayを使って経路を用意することが選択肢としてあります。
VNET作成
LinuxコンテナーでACIをVNET統合する場合は、日本リージョンの場合だと東日本が選択肢となります。
西日本は現時点でVNET統合時のリソース制約が該当なし
となっていました。
試しに作成したところエラーになりました。
今回は東日本リージョンにて作成しました。
サブネットは、ACI用とApplication Gateway用と最低2つ用意しておきましょう。
プライベートACIを作成
ネットワークタグで、プライベート
->仮想ネットワーク
->サブネット
を選択しておきます。
デプロイ後、IPアドレスがプライベートであることが確認できました。
もちろん、このままこのIPアドレスで外部から接続することは出来ません。
ただし、今回は試していませんがVNETへのプライベート接続(VPNなど)が用意できれば、Application Gatewayを使わない経路も出来そうです。
外部から接続するためにApplication Gatewayを使う
Azure Application GatewayはL7ロードバランサーです。
VNET統合が出来て、バックエンドプールにIPアドレスの指定が可能なサービスなので今回試してみることにしました。
構成時にACIをデプロイしたVNETを選択します。
パブリックIPアドレスは事前に作成しておいたものでも良いのですが、SKUはApplication Gatewayとあわせておく必要がありますので、その点は注意です。
バックエンドターゲットにACIのプライベートIPアドレスを指定します。
その他は通常のHTTPのバックエンドルールで良いです。あとからカスタマイズすればいいかなと。
デプロイされたら、Application GatewayのパブリックIPアドレスからアクセスしてみましょう。
ACIのコンテンツにアクセスすることが出来ました。
NSG(ネットワークセキュリティグループ)の作成
さらに、IPアドレスの制限を加えてみましょう。
Application GatewayのWAF機能を使って何らかの攻撃対策を行うのもありですが、今回はシンプルにNSGを構成してインバウンドの制限を行います。
まずはNSGを作成してApplicaiton Gatewayをデプロイしたサブネットと関連付けを行います。
受信セキュリティ規則で、特定IPアドレスからのみのHTTPアクセスを許可します。
一点注意点があって、Application Gatewayは65200~65535のGatewayManagerサービスタグの着信トラフィックを許可する必要があります。
Azureインフラストラクチャ間の通信に必要らしく、許可されていない場合はサブネットへの関連付けが出来ません。
受信規則作成後、アクセスして確認してみましょう。
まずは許可されていない接続元の場合です。
期待どおり、接続することが出来ませんでした。
次に、許可された接続元の場合です。
期待どおり、接続することが出来ました。
まとめ
- ACIでもVNET統合とApplication Gatewayを使うと公開しつつある程度のセキュリティ対策が可能
- ACIをVNET統合する際は対応リージョンに注意が必要
- Application GatewayにNSGを関連付ける場合はGatewayManagerサービスタグの通信許可を忘れないようにする